#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STUDENT_MAX 100
#define ADMIN_MAX 10

enum MEUN_CHOICE
{

    EXIT_SYSTEM = 0,   // 退出系统
    ADD_STUDENT,       // 添加学生
    DELETE_STUDENT,    // 删除学生
    UPDATE_STUDENT,    // 修改学生
    VIEW_STUDENT,      // 查看学生
    VIEW_ALL_STUDENTS, // 查看所有学生
    VIEW_ALL_ADMINS,   // 查看所有管理员
    LOGOUT             // 注销
};

enum MENU_LOGIN
{
    LOGIN = 1, // 登录
    ENROLL     // 注册
};

struct Student
{
    char name[10];
    int age;
    int score;
};
struct Admin
{
    char username[10];
    char password[10];
};

struct Student stu[STUDENT_MAX] = {
    {"Tom", 18, 100},
    {"Jerry", 19, 90},
    {"Mike", 20, 80}};

struct Admin admin[ADMIN_MAX] = {
    {"admin", "123"},
    {"admin1", "123456"},
    {"admin2", "123456"}};

int login_flag = 0;                  // 登录标志
int admin_index = 3;                 // 当前管理员索引
int student_index = 3;               // 当前学生索引
void printf_function_menu();         // 打印主菜单函数
void menuOperate(int menu);          // 执行菜单
void return_Main();                  // 返回主菜单
void add_student();                  // 录入学生信息
void delete_student();               // 删除学生信息
void updata_student();               // 修改学生信息
void show_one();                     // 查看学生信息
void show_all();                     // 查看所有学生信息
int find_student();                  // 查找学生索引
void show_all_admin();               // 查看所有管理员账号
void printf_login_menu();            // 打印登录菜单函数
void menuOperate_login(int menu);    // 执行登录菜单
void login();                        // 登录
int verify_username(char *);         // 验证用户名是否存在
int verify_password(char *, char *); // 验证密码是否正确
void enroll();                       // 注册

int main()
{
    int menu;      // 操作
    system("cls"); // 清空控制台内容
    while (1)
    {
        system("cls"); // 清空控制台内容
        // 未登录
        while (login_flag == 0)
        {

            printf_login_menu();
            scanf("%d", &menu);
            menuOperate_login(menu);
        }

        // 已登录
        system("cls"); // 清空控制台内容
        while (login_flag == 1)
        {
            printf_function_menu();
            scanf("%d", &menu);
            menuOperate(menu);
        }
    }

    return 0;
}

// 打印主菜单函数
void printf_function_menu()
{
    printf("             学生管理系统           \n");
    printf("----------------------------------------\n");
    printf("| 1、录入学生信息\t\t       |\n");
    printf("| 2、删除学生信息\t\t       |\n");
    printf("| 3、修改学生信息\t\t       |\n");
    printf("| 4、查看学生信息\t\t       |\n");
    printf("| 5、查看所有学生信息\t\t       |\n");
    printf("| 6、查看所有管理员信息\t\t       |\n");
    printf("| 7、退出登录\t\t\t       |\n");
    printf("| 0、退出系统\t\t\t       |\n");
    printf("----------------------------------------\n");
    printf("请输入相应的序号选择:");
}

// 执行菜单
void menuOperate(int menu)
{
    int index = -1;
    system("cls"); // 清空控制台内容
    switch (menu)
    {
    case ADD_STUDENT:
        add_student();
        return_Main();
        break;
    case DELETE_STUDENT:
        delete_student();
        return_Main();
        break;
    case UPDATE_STUDENT:
        updata_student();
        break;
    case VIEW_STUDENT:
        show_one();
        break;
    case VIEW_ALL_STUDENTS:
        show_all();
        return_Main();
        break;
    case VIEW_ALL_ADMINS:
        show_all_admin();
        return_Main();
        break;
    case LOGOUT:
        login_flag = 0;
        break;
    case EXIT_SYSTEM:
        printf("退出成功!");
        exit(0);
    default:
        break;
    }
}

// 返回主菜单
void return_Main()
{
    while (1)
    {
        char c;
        printf("----------------------------------------\n");
        printf("输入 0 返回主菜单:");
        scanf(" %c", &c);
        if (c == '0')
        {
            system("cls"); // 清空控制台内容
            break;
        }
    }
}

// 退出功能页面
int return_function()
{
    while (1)
    {
        char c;
        printf("是否返回主页面?(Y/N)");
        scanf(" %c", &c);
        if (c == 'Y' || c == 'y')
        {
            system("cls"); // 清空控制台内容
            return 1;
        }
        else if (c == 'N' || c == 'n')
        {
            return -1;
        }
    }
}

// 录入学生信息
void add_student()
{
    printf("             录入学生信息                 \n");
    printf("----------------------------------------\n");
    printf("开始录入学生信息:\n请输入姓名、年龄和成绩:\n");
    scanf("%s %d %d", stu[student_index].name, &stu[student_index].age, &stu[student_index].score);
    printf("录入成功!录入信息:\n");
    printf("姓名: %s 年龄: %d 成绩: %d\n", stu[student_index].name, stu[student_index].age, stu[student_index].score);
    student_index++;
}

// 删除学生信息
void delete_student()
{
    printf("             删除学生信息                 \n");
    printf("----------------------------------------\n");
    printf("你删个蛋!\n");
}

// 修改学生信息
void updata_student()
{
    printf("             修改学生信息                 \n");
    printf("----------------------------------------\n");
    int index = 0;
    printf("请输入想要修改的学生姓名:");
    while (1)
    {
        if ((index = find_student()) == -1) // 没找到对应学生
        {
            if (return_function() == 1)
            {
                return;
            }
            printf("请重新输入想要修改的学生姓名:");
        }
        else
        {
            printf("需要修改的学生姓名: %s 年龄: %d 成绩: %d\n", stu[index].name, stu[index].age, stu[index].score);
            printf("请输入要修改的姓名、年龄和成绩:\n");
            int ret = scanf("%s %d %d", stu[index].name, &stu[index].age, &stu[index].score);
            if (ret != 3)
            {
                printf("修改失败!");
                return_Main();
                break;
            }
            else
            {
                printf("修改成功!\n");
                return_Main();
                break;
            }
        }
    }
}

// 查看学生信息
void show_one()
{
    printf("             查看学生信息                 \n");
    printf("----------------------------------------\n");
    int index = 0;
    printf("请输入想要查看的学生姓名:");
    while (1)
    {
        if ((index = find_student()) == -1) // 没找到对应学生
        {
            if (return_function() == 1)
            {
                return;
            }
            printf("请重新输入想要查看的学生姓名:\n");
        }
        else
        {
            printf("该学生姓名: %s 年龄: %d 成绩: %d\n", stu[index].name, stu[index].age, stu[index].score);
            return_Main(); // 返回主菜单
            return;
        }
    }
}

// 查看所有学生信息
void show_all()
{
    printf("           查看所有学生信息                 \n");
    printf("----------------------------------------\n");
    printf("共有%d 个学生信息。所有学生的信息如下：\n", student_index);
    printf("姓名\t年龄\t成绩\n");
    for (int i = 0; i < student_index; i++)
    {
        printf("%s\t%d\t%d\n", stu[i].name, stu[i].age, stu[i].score);
    }
}

// 查找学生索引
int find_student()
{
    int temp = 0;
    char name[32];
    int i = 0;
    scanf(" %s", name);
    // 查找对应学生信息
    for (i = 0; i < student_index; i++)
    {
        if (strcmp(stu[i].name, name) == 0)
        {
            temp = 1;
            return i;
        }
    }
    if (temp != 1)
    {
        printf("没找到对应学生!\n");
        return -1;
    }
}

// 查看所有管理员账号
void show_all_admin()
{
    printf("           查看所有管理员信息                  \n");
    printf("----------------------------------------\n");
    printf("共有%d个管理员账号。所有管理员账号如下:\n", admin_index);
    for (int i = 0; i < admin_index; i++)
    {
        printf("%s\n", admin[i].username);
    }
}

// 打印登录菜单函数
void printf_login_menu()
{
    printf("         欢迎来到学生管理系统           \n");
    printf("----------------------------------------\n");
    printf("| 1、登录\t\t\t       |\n");
    printf("| 2、注册\t\t\t       |\n");
    printf("| 0、退出\t\t\t       |\n");
    printf("----------------------------------------\n");
    printf("请输入相应的序号选择!          \n");
}

// 执行登录菜单
void menuOperate_login(int menu)
{
    system("cls"); // 清空控制台内容
    switch (menu)
    {
    case LOGIN:
        login();
        break;
    case ENROLL:
        enroll();
        break;
    case EXIT_SYSTEM:
        printf("退出成功!");
        exit(0);
    default:
        break;
    }
}

// 登录
void login()
{
    printf("                  登录                  \n");
    printf("----------------------------------------\n");
    char username[100];
    char password[100];
    printf("请输入账号:");
    scanf("%99s", username);
    printf("请输入密码:");
    scanf("%99s", password);
    if (verify_username(username) == -1)
    {
        printf("用户名不存在!\n");
        return;
    }
    else
    {
        if (strcmp(admin[verify_username(username)].password, password) == 0)
        {
            login_flag = 1;
            printf("登录成功!\n");
            return;
        }
        else
        {
            printf("密码错误!\n");
            return;
        }
    }
}

// 验证用户名是否存在
int verify_username(char *username)
{
    for (int index = 0; index < admin_index; index++)
    {
        if (!strcmp(admin[index].username, username))
        {
            return index; // 返回用户名对应的索引
        }
    }
    return -1; // 返回-1表示用户名不存在
}

// 验证密码是否正确
int verify_password(char *username, char *password)
{
    for (int index = 0; index < admin_index; index++)
    {
        if (!strcmp(admin[index].username, username))
        {
            if (!strcmp(admin[index].password, password))
            {
                return 1;
            }
            else
            {
                printf("密码错误!\n");
                return -1;
            }
        }
    }
}

// 注册
void enroll()
{
    printf("                  注册                  \n");
    printf("----------------------------------------\n");
    char username[10];
    char password[10];
    printf("请输入用户名:");
    scanf("%s", username);
    if (verify_username(username) == -1)
    {
        printf("请输入密码:");
        scanf("%s", password);
        printf("注册成功!\n");
        strcpy(admin[admin_index].username, username);
        strcpy(admin[admin_index].password, password);
        admin_index++;
    }
    else
    {
        printf("用户名已存在!\n");
        return;
    }
}